import java.util.Vector;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 * 
 * @author Christopher Luttmann
 * @author Alejandro Rojas
 */

public class Robot extends MIDlet implements CommandListener {
 
    private Display display;
    private Command exitC;
    private Command inicioC, instruC, idiomaC, cambiopage, runpro;
    private Command derecha,izquierda, arriba, abajo, regresar,cblock, genmap, gogenmap;
    private CanvasForm  canvas1;
    private CanvasForm canvasmap;
    private Form page2,instrucc;
    private TextField ingreso1;
    private StringItem label,lmov;
    private int  xr, yr, idiom;
    private int [][]  gmatrix; 
    private String iniciar, instrucciones, idioma,generars,salir,irmap;
    private String derechas, izquierdas, arribas, abajos, regresars, cblocks,genmaps;
    private String tcarscrip,ttext, tins, movt, runprot;
    private String listain  ;
    private Vector lista;
  
    /**
    * Constructor
    * Inicializa la pantalla con los comandos necesarios
    **/
    public Robot(){   //inicializa la pantalla
        listain = ";";
        lista = new Vector();
        display = Display.getDisplay(this);
        canvas1 = new CanvasForm();
        display.setCurrent(canvas1); 
        canvas1.repaint(); 
        idiom = 0;
        eleidioma();   
        comandos();
    }
    
    /**
    *
    * eleidioma
    * eleccion del idioma (ingles/espaniol)
    **/
    public void split(String cadena, String separador){
        
             int pos = 0;
            pos = cadena.indexOf(separador);
   while(pos >= 0){
      if (cadena.substring(0,pos).trim().equalsIgnoreCase("1")){
            canvas1.movDerecha();
            canvas1.repaint();
                }
      if (cadena.substring(0,pos).trim().equalsIgnoreCase("2")){
            canvas1.movIzquierda();
            canvas1.repaint();
                }
      if (cadena.substring(0,pos).trim().equalsIgnoreCase("3")){
            canvas1.movArriba();
            canvas1.repaint();
                }
      if (cadena.substring(0,pos).trim().equalsIgnoreCase("4")){
            canvas1.movAbajo();
            canvas1.repaint();
                }
      cadena = cadena.substring(pos + separador.length());
      pos = cadena.indexOf(separador);
   }
}
    ////////////////////////////////////////////////////
    public void eleidioma(){
           // 0 para espanol
           // 1 para ingles
        if(idiom == 0){
            iniciar = "Reiniciar";
            instrucciones = "Instrucciones";
            idioma = "Idioma";
            generars = "Generar Script";
            salir = "Salir";
            irmap ="Ir Gen. Map";
            derechas = "Derecha";
            izquierdas= "Izquierda";
            arribas ="Arriba";
            abajos ="Abajo";
            regresars= "Regresar";
            cblocks= "Colocar Bloque";
            genmaps= "Generar Mapa";
            tcarscrip= "Cargar Script";
            ttext = "Ingreso Programa";
            runprot= "Ejecutar Programa";
            tins = "Para movilizarse alrededor de mapa: presione 2 para ir arriba"
                    + ",8 para ir abajo, 6 para ir a la derecha y 4 para ir a la izquierda. El robot"
                    + " es representado por un cuadro de color rojo que dejara un punto blanco por los lugares en "
                    + " los cuales ya ha estado. En las opciones de pantalla principal puede elegirse si "
                    + "generar un nuevo mapa, en el cual pueden colocarse bloques de pared, al finalizar de colocar los"
                    + " bloques deben elegirse la opcion de generar mapa para que este sea cargado a la pantalla principal. "
                    + "                                                                                     "
                    + "Para crear un nuevo scrip que el robot ejecutara debe elegirse la opcion de generar mapa en la "
                    + "pantalla principal, el script solo puede generarse por me dio de los comandos del menu de opciones."
                    + "NOTA: El robot al encontrar una pared topara y no  podra atravesarla. ";
        }

        if(idiom == 1){
            iniciar = "Reset";
            instrucciones = "Instructions";
            idioma = "Language";
            generars = "Generate Script";
            salir = "Exit";
            irmap ="Go to Gen. Map";
            derechas = "Right";
            izquierdas= "Left";
            arribas ="Up";
            abajos ="Down";
            regresars= "Go MapWorld";
            cblocks= "Place block";
            genmaps= "Generate Map";
            tcarscrip= "Upload script";
            ttext = "Program Income";
            runprot ="Run Program";
            tins = "To move around the map, press 2 to go up "
                     + ", press 8 to go down, press 6 to go right and press 4 to go left. The robot"
                     + " is represented by a red box will generate a white point in places"
                     + " which has already been. In the options screen can be selected if"
                     + " generate a new map, which can be placed in the wall blocks at the end of placing"
                     + " block should choose to generate this map to be uploaded to the main screen."
                     + "                                                                 "
                     + "To create a new script that run the robot should choose to generate the map"
                     + "Screen, the script can only be generated by the script gave me the menu of options."
                     + "NOTE: The robot bumped to find a wall and can not pass through.";
      
        }
    }
   
   /**
    *
    * comandos
    * Opciones del menu principal
    **/
    public void comandos(){
        
        inicioC = new Command(iniciar,Command.OK,1);
            canvas1.addCommand(inicioC);            
        instruC = new Command(instrucciones,Command.OK,2);
            canvas1.addCommand(instruC);
        idiomaC = new Command(idioma,Command.OK,3);
            canvas1.addCommand(idiomaC);            
        cambiopage = new Command(generars, Command.OK,4);
            canvas1.addCommand(cambiopage);
        exitC = new Command(salir,Command.EXIT,1); 
            canvas1.addCommand(exitC);
        gogenmap = new Command(irmap,Command.OK,5);
            canvas1.addCommand(gogenmap);
       runpro = new Command(runprot,Command.OK,6);
            canvas1.addCommand(runpro);
        canvas1.setCommandListener(this);        
    }
    
    /**
    *
    * comandospag2
    * opciones de los comandos para movimiento del robot
    **/
    public void comandospag2(){
         
        derecha = new Command(derechas,Command.OK,1);
            page2.addCommand(derecha);            
        izquierda = new Command(izquierdas,Command.OK,2);
            page2.addCommand(izquierda);
        arriba = new Command(arribas,Command.OK,3);
            page2.addCommand(arriba);            
        abajo = new Command(abajos, Command.OK,4);
            page2.addCommand(abajo);
        regresar = new Command(regresars,Command.OK,5); 
            page2.addCommand(regresar);
 
        page2.setCommandListener(this);        
    }
    
    /**
    * 
    * comandosgenmap
    * Crea los comandos necesarios para generar un mapa
    **/
    public void comandosgenmap(){
        
        cblock = new Command(cblocks,Command.OK,1);
            canvasmap.addCommand(cblock);            
        regresar = new Command(regresars,Command.OK,2); 
            canvasmap.addCommand(regresar);
        genmap = new Command (genmaps, Command.OK,3);
            canvasmap.addCommand(genmap);
 
        canvasmap.setCommandListener(this);        
    }
     
    /**
    *
    * ingresoblock
    * Indica donde debe de ir una pared.
    **/
    public void ingresoblock(){
        xr = canvasmap.getXr();
        yr = canvasmap.getYr();
        gmatrix[yr][xr] = 1;
        canvasmap.setMapmatrix(gmatrix);
        canvasmap.repaint();
        gmatrix = canvasmap.getMapmatrix();
    }

    /**
    *
    * startApp
    * inicio de aplicacion
    **/
    public void startApp(){
      
    }

    /**
    *
    * pauseApp
    * detiene la aplicacion
    **/
    public void pauseApp(){}

    /**
    *
    * destroyApp
    * @param unconditional 
    *  
    **/
    public void destroyApp(boolean unconditional){}

    /**
    *
    * @param 
    * habilita los comandos de accion.
    **/
    public void commandAction(Command c, Displayable d){
        if(c == exitC){//lectura del comando salir
            destroyApp(false);
            notifyDestroyed();
        }  
        if (c== instruC ){
       
            instrucc = new Form(instrucciones);
           label = new StringItem (tins," ");
            display.setCurrent(instrucc); 
         regresar = new Command(regresars,Command.OK,5); 
              instrucc.append(label);
            instrucc.addCommand(regresar);
 
        instrucc.setCommandListener(this);
        }
        
        if(c == inicioC){//lecutra del comando iniciar
            canvas1 = new CanvasForm();
            display.setCurrent(canvas1); 

            canvas1.repaint();  
            comandos();
        } 
           
        if (c == idiomaC){
            canvas1 = new CanvasForm();
            display.setCurrent(canvas1); 
            canvas1.repaint();
            if (idiom == 1)
                idiom = 0;
            else
                idiom = 1;
            
            eleidioma(); 
            comandos();
        }
         if(c == gogenmap){//
          
            canvasmap = new CanvasForm();
            display.setCurrent(canvasmap); 
            canvasmap.repaint();
            gmatrix = canvasmap.getMapmatrix();
            comandosgenmap();
        }
        if(c == cambiopage){//     
            ingreso1 = new TextField(ttext,"",30,TextField.NUMERIC);
             listain = ";";
            page2 = new Form(tcarscrip);
           // page2.append(ingreso1);
            display.setCurrent(page2); 
            comandospag2();
        }  
        if(c == regresar){//
            display.setCurrent(canvas1);
            canvas1.repaint();  
        }  
        if(c == derecha){//
           
           
            listain = listain + "1;";
            movt= derechas;
            lmov = new StringItem (movt," ");
            page2.append(lmov);
           // canvas1.movDerecha();
            //canvas1.repaint();  
        }  
        if(c == izquierda){//
            listain = listain + "2;";
            movt= izquierdas;
            lmov = new StringItem (movt," ");
            page2.append(lmov);
            //canvas1.movIzquierda();
            canvas1.repaint();  
        }    
        if(c == arriba){//
            listain = listain + "3;";
            movt= arribas;
            
            lmov = new StringItem (movt," ");
            page2.append(lmov);
            //canvas1.movArriba();
            canvas1.repaint();  
        }    
                      
        if(c == abajo){//
            listain = listain + "4;";
            movt=  abajos;
            
            lmov = new StringItem (movt," ");
            page2.append(lmov);
            //canvas1.movAbajo();
            canvas1.repaint();  
        }   
        if(c == cblock){//
            ingresoblock();
            canvasmap.repaint();  
        } 
        if (c ==runpro){
         split (listain,";");          
        
        }
        if(c == genmap){//
            yr = canvasmap.getYr();
            xr = canvasmap.getXr();
            for (int fil = 0; fil<21;fil++){
                for (int col = 0; col <20; col ++){
                    if (gmatrix [fil][col] == 3)
                        gmatrix[fil][col]= 0;
                }
            }
            gmatrix[yr][xr]=2;
            canvasmap.setMapmatrix(gmatrix);
            canvas1.setYr(yr);
            canvas1.setXr(xr);
            canvas1.setMapmatrix(canvasmap.getMapmatrix());
            canvas1.repaint();  
        } 
    } 
    
}
